lpunbfandomcom-20200214-history
LP-2-2013: Seminário Perl - Vitor Lacerda 110067142
Perl é uma linguagem de alto nível criada por Larry Wall em 1987 para facilitar o processamento de relatórios. É uma linguagem de processo geral baseada em Unix que usa recursos de várias linguagens, particularmente C, shell, AWK e sed. Interessantemente, o nome Perl não é um acrônimo, mas mesmo assim, em alguns lugares surgiram significados e expansões para o nome. Practical Extraction and Report Language ''é uma das expansões mais comuns. O próprio Wall fez uma contribuição humorosa a isso com o nome ''Pathologically Eclectic Rubbish Lister. Perl é motivada pelo slogan "Há mais de uma forma de se fazer". Visão Geral Perl é uma linguagem open-source ''distribuída de forma gratuita e aberta. Muito do suporte da linguagem é criada de forma colaborativa por usuários voluntários. Apesar de ter sido criada com a manipulação de textos e relatórios em mente, hoje em dia a linguagem Perl é usada para uma série de aplicações diferentes como desenvolvimento web, administração de sistemas e programação de redes. A intenção de Larry Wall ao criar Perl foi criar uma linguagem prática. Com as palavras dele mesmo "Coisas fáceis devem ser fáceis e coisas difíceis devem ser possíveis.". Com isso Perl se tornou uma linguagem que dá preferência a praticidade sobre a elegância. Por natureza, Perl é uma linguagem procedural, mas possui suporte para programação orientada a objetos. Um dos grandes recurso de Perl é a capacidade de se integrar com a maioria dos bancos de dados modernos e trabalhar com linguagens mark-up como HTML e XML. Perl 6 Quando se fala de Perl, normalmente estamos falando de Perl 5. A versão mais atual de Perl. Perl 6 é uma linguagem irmã, sendo desenvolvida pela comunidade, que mantém os mesmo ideais criados por Larry Wall. Ainda assim ela possui algumas diferenças e pode ser considerada uma linguagem independente de sua irmã mais velha. Sintaxe Geral Um script Perl consiste de nada mais do que uma série de afirmativas e assertivas escritas de forma direta no arquivo fonte do programa. Não existe necessidade de se criar uma função main() ou coisa parecida. Os comandos são executados sempre de cima para baixo. É importante lembrar que diferente de linguagens como o Phyton por exemplo, espaços em branco e identação tem funcionalidade apenas estética e são completamente opcionais na programação. Além disso, vários outros elementos da sintaxe também tem caráter opcional. Por exemplo os argumentos de uma função podem ou não vir entre parentêses. Como em várias outras linguagens de programação cada comando em Perl termina com um ponto-e-vírgula(;). Um comentário é iniciado pelo caractere #. Sendo assim um programa básico em Perl teria a seguinte aparência: print "Ola Mundo."; #Essa linha diz olá para o mundo inteiro. print ("Ola Mundo, de novo."); Variáveis Existem três tipo principais de variáveis na linguagem Perl: *Escalares - Representam valores atômicos, como um inteiro ou um caracter. *Arrays (Vetores) - Representam um conjunto de valores. *Hashes - Representam um conjunto de relações do tipo chave - valor. Declarar uma variável em Perl é simples. Basta escrever o símbolo correspondente ao tipo ($, @ ou %) seguido diretamente do nome desejado para a variável. Também é possível determinar um valor para uma variável na própria declaração. O uso da palavra reservada '''my 'é opcional, mas extremamente recomendado e importante. Ela faz com que a variável declarada fique apenas no escopo do bloco onde foi declarada. Variáveis declaradas sem my 'são globais. Perl possui uma série de variáveis que já são 'reservadas'. A mais comum delas é a variável padrão $_. Ela é usada em vários laços de repetição e como argumento de várias outras funções e expressões regulares. #Um exemplo de declaração de variáveis. #escalares $numero = 55; #essa variavel é global. my $nome = vitor; #arrays my @materias = ("OAC","LP", "PC"); my @numeros = (1,2,3,4); #hashes my %notas = ( LP => 6, OAC => 4 ); Escalares Uma variável escalar representa valores atômicos. Eles podem ser strings ou valores numéricos. Os escalares são definidos pelo cifrão ($). É possível especificar valores inteiros ou valores de ponto flutuante (números reais), mas é importante lembrar que em Perl, internamente, considera todos os escalares numéricos como valores de ponto flutuante de precisão dupla. Isso siginifica que não há operações inteiras na linguagem Perl. As strings em Perl podem ser declaradas usando aspas simples ( ' ) ou aspas duplas ( " ). A maior diferença que existe entre as duas é strings contidas em aspas simples interpretam o caracter '\ de forma diferente. Aspas duplas permitem comandos como \n e \t, enquanto com aspas simples os caracteres \n seriam impressos normalmente. O operador de concatenação de strings é o ponto ( . ). Por exemplo "Ola"." mundo" tem como resultado a string "Ola mundo". Perl automaticamente converte entre esses dois tipos de dados para fazer operações. Então se uma operação espera um número inteiro, Perl transforma a string em um inteiro. Por exemplo "24" + "3", tem como resultado o número 27. Da mesma forma, uma operação que espera strings é capaz de converter inteiros. Como muitas outras linguagens, Perl possui um operador binário de atribuição. Então é para operações comuns como $contador = $contador +1; pode-se simplesmente usar $contador += 1; Abaixo estão alguns exemplos de programas que usam possíveis operações com escalares e suas respectivas saídas: Programa: my $name = "Vitor"; my $idade = 22; print "Meu nome e $name e eu tenho $idade anos"; Saída: Meu nome e Vitor e eu tenho 22 anos Programa: my $string = '12Vitor4'; my $numero = 33; print "Resultado:" . ($string + $numero) . "\n"; #Concatena a string com o resultado numérico da operação '+'. Saída: Resultado:45 Arrays Arrays em Perl são listas de valores escalares que podem ser heterogêneas. Isso significa que uma variável do tipo array pode conter qualquer combinação de inteiros, strings, valores undefs ou valores de ponto flutuante sem problemas. Ainda é assim, é uma prática mais comum que todos os valores tenham o mesmo tipo. Os arrays são representados pelo símbolo do arroba ( @ ) e são todos indexados com base em zero. Isso é, o primeiro elemento está no índice 0 do array. Acesso ao array é como em várias outras linguagens. my @disciplinas = ("OAC", "LP", "POO", "CD"); #Voce pode usar um elemento do vetor em qualquer lugar onde poderia usar um escalar. Note o uso do $ print $disciplinas0.$disciplinas1."\n"; #Qualquer valor ainda não definido do vetor é tipo como undef print $disciplinas99."\n"; #É possível definir valores além do tamanho atual do vetor e Perl extende o tamanho do array. Valores intermediários recebem undef até serem definidos. $disciplinas99 = "SI"; print $disciplinas50."\n".$disciplinas99."\n"; #A variável especial $#array acessa o último indíce do array. print $disciplinas$#disciplinas."\n"; #O índice -1 também funciona. print $disciplinas-1."\n"; A saída do código acima: OACLP SI SI SI Existem várias operações que podem ser executadas sobre arrays #O operador de alcance. Usando o '..' podemos criar listas como abaixo. my @lista = (1..15); #Essa lista contém os números de 1 a 15. print @lista; print "\n"; #O operador pop retorna o último elemento da lista e o remove. print (pop(@lista)."\n"); #O operador push insere ao final da lista push(@lista, 16); print $lista$#lista."\n"; #Shift e Unshift são os opostos de pop e push respectivamente. Eles fazem o que push e pop fazem, mas no início da lista. print(shift(@lista)."\n"); unshift(@lista, 0); print @lista; print "\n"; #O operador splice pode ter 2,3 ou 4 argumentos. #Os dois primeiros são sempre a lista e uma posição inicial. #Com 2 argumentos, splice retorna uma segunda lista com todos os valores após a posição especificada e os remove da lista. @lista = (1..15); print(splice(@lista,5)); print " "; print@lista; print "\n"; #O terceiro argumento especifica o tamanho da lista a remover. @lista = (1..15); print(splice(@lista,5,3)); print " "; print@lista; print "\n"; #O quarto argumento é uma lista a substituir no lugar da que foi removida. Ela não precisa ter o mesmo tamanho. @lista = (1..15); print(splice(@lista,5,3,(0,0,0,0,0,0,0))); print " "; print@lista; print "\n"; #O operador reverse retorna uma lista invertida print(reverse(@lista)); print"\n"; #O operador sort recebe uma lista e retorna uma lista organizada. #É importante lembrar que ele organiza os números como strings. @lista = (3,1,7,5,99,13,0); print(sort(@lista)); print"\n"; A saída do programa acima: 123456789101112131415 15 16 1 023456789101112131416 6789101112131415 12345 678 123459101112131415 678 1234500000009101112131415 1514131211109000000054321 011335799 Hashes Hashes são tipos de variáveis que armazenam relações do tipo chave/conteúdo. Elas são representadas pelo símbolo %. Existem duas maneiras de se declarar um hash. #Dessa forma cada par representa um par chave/conteudo. Assim, OAC é a chave de Organização e Arquitetura de Computadores. my %ilegivel = ("OAC","Organização e Arquitetura de Computadores","LP","Linguagens de Programação","POO","Programação Orientada a Objetos"); #Essa outra forma dá o mesmo resultado, mas é muito mais legível para humanos. my %legivel = ( OAC => "Organização e Arquitetura de Computadores", LP => "Linguagens de Programação", POO => "Programação Orientada a Objetos" ); Para acessar um elemento de um hash usamos: $legivel{"OAC"}; #retorna Organização e Arquitetura de Computadores Note que a primeira forma de se declarar um hash, é na verdade um array que contém os pares chave/conteúdo. Então fazer a operação: my %hash = reverse %hash Faz com que as chaves de hash se tornem valores e vice-versa. Isso é por causa da forma com que Perl armazena o hash na memória. Algumas funções úteis para se usar com hashes: my %siglas = ( OAC => "Organização e Arquitetura de Computadores", LP => "Linguagens de Programação", POO => "Programação Orientada a Objetos" ); #A função keys() retorna um array com todas as chaves. #Similarmente values() retorna um array com os valores. print(keys(%siglas)); print"\n"; print(values(%siglas)); print"\n"; #A função exists() retorna verdadeiro se seu parâmetro for uma chave válida da hash if(exists $siglas{"OAC"}){ print "Existe OAC\n"; } #A função delete elimina completamente um par da hash delete $siglas{"LP"}; if(exists $siglas{"LP"}){ print "Existe LP\n"; } else{ print "Não existe LP\n"; } A saída desse programa: POOOACLP Programação Orientada a ObjetosOrganização e Arquitetura de ComputadoresLinguagens de Programação Existe OAC Não existe LP Estruturas de controle e repetição Perl possui todas as expressões de controle que um programador C ou Java já está acostumado e até mais algumas. A mais básica e fundamental delas é o if/else: if( condicao true){ ... } else{ ... } O bloco de código dentro do if é executado se a expressão booleana contida nos parenteses retorna o valor verdadeiro. 0, '0', "", () e undef são todos valores falsos em um contexto booleano. Como uma alternativa mais legível para a expressão if(!condicao) onde ! é o operador de negação, Perl possui um comando unless. Ele funciona exatamente como if(!condicao) então o código: unless(condicao){ ... } Executado o bloco dentro das chaves se a condição for falsa. Em Perl é possível usar if de forma pós-fixada: print "Frase" if(condicao); #imprime "Frase se condicao true" A estrutura while funciona de forma parecida ao if, mas executada enquanto a condição apresentada for verdadeira. Similarmente ao unless, existe o until. E da mesma forma que o if, o while pode ser usado de forma pós-fixada. while(condicao){ ... } print "A" until(condicao); Perl possui uma estrutura for que funciona exatamente da mesma maneira que em C. Mas ela é pouco usada, normalmente se dá preferência a estrutura muito mais amigável e fácil de se usar para percorrimento de listas, o foreach. Foreach percorre uma lista apresentada e usa a variável padrão $_ para armazenar temporariamente cada valor da lista. foreach @numeros { $_ += 1; } #Aumenta em 1 todos os valores da lista @numeros #Também é possível usar uma outra varíavel: foreach my $a (@numeros) { a += 1; } #Dessa vez usa a variável $a. Operadores de Comparação Esses operadores são usados para construir as expressões boolenans usadas nas estruturas de controle e repetição. Operadores Numéricos: igualdade != desigualdade <''' menor que '''> maior que <= menor ou igual que ' >=' maior ou igual que Operadores para strings: eq igualdade ne desigualdade lt '''menor que '''gt maior que le '''menor ou igual a '''ge maior ou igual a